[3, 2, 1].reduce(Math.pow);
// m -> 3 n -> 2 Math.pow(3,2) -> 9
// m -> 9 n -> 1 Math.pow(9,1) -> 9

[3].reduce(Math.pow); // [3] -> 3 Math.pow不执行，就直接返回3.

[].reduce(Math.pow, 3);// 3 -> 3 同样Math.pow不执行，直接返回。

[].reduce(Math.pow); // 如果一个空数组，那么就会抛出一个异常，这是reduce最基本的原则

// Math.pow(m, n) -> m ^ n
// 如：console.log(Math.pow(3,2));

// reduce
[].reduce((preValue, curValue, index,array)=>{
    // preValue叫上一轮循环的返回值
    // curValue叫当前值，对数组的每类循环中获取到的元素
    // index当前数组元素对应的索引
    // array数组的本身

    // initValue 传递
    // preValue -> initValue
    // curValue -> array[0]
    // initValue 没有传递
    // preValue -> array[0]
    // curValue -> array[1]

}, initValue);
// initValue表示初始值


/**
 * reduce(Math.pow)中隐藏的坑。
 * 总结:
 * 1. 如果数组位空且没有提供initialValue,会抛出TypeError。
 * 2. 如果数组仅有一个元素 (无论位置如何) 并且没有提供initialValue。
 * 3. 有提供initialValue但是数组为空，
 *    那么此唯一值将被返回并且callback不会被执行。
 */